<?php
namespace App\Common;

use Illuminate\Support\Facades\Schema;

/**
* 表的 共用处理函数
* @date: 2016年10月23日 上午9:15:58
* @author: lee
*/
class tbCommon
{
    // 检索 icon返回的 字段
    // iconfid （icon的fid）,title（标题）,content（描述内容）,
    // likenum,storenum（被点赞、收藏数）
    // userid,username,useravatar（用户id,名称，头像）,
    // favourstate,storedstate（是否被该用户点赞、收藏）
    static public $iconImg_IconClum=['icnfid','title','title_cn','content','content_cn',
        'likenum','browsenum','storenum','userid','username','useravatar','height',
        'weight','bust','bra','uaddress',
        'favourstate','storedstate','lng','lat','address',
        'createdat','followstate'];
    // 无用户属性信息
    static public $iconImg_IconClum2=['icnfid','title','title_cn','content','content_cn',
        'likenum','browsenum','storenum',
        'favourstate','storedstate','lng','lat','address',
        'createdat','followstate'];
    
    // 无用户属性信息
    static public $iconImg_IconClum3=['userid','username','icnfid','title','title_cn','content','content_cn',
        'likenum','browsenum','storenum',
        'favourstate','storedstate','lng','lat','address',
        'createdat'];
    
    static public $iconImg_IconClum4=['userid','icnfid','title','title_cn','content','content_cn',
        'likenum','browsenum','storenum',
        'favourstate','storedstate','lng','lat','address',
         'createdat'];
    
    // 私人衣厨 匹配项
    static public $iconImg_IconClumSelf=['icnfid','title','title_cn','content','content_cn','lng','lat','address','createdat',];
    
    // 检索 image的返回字段
    // imgfid（image的fid）,imglink（image的path）
    static public $iconImg_ImgClum=['imgfid','imglink',"thumb_imglink","imgwd","imght"];
    
    // image-tag 表联查时候的  各返回的字段
    static public $imgTag_ImgClum=['imgfid'];
    static public $imgTag_TagClum=['tgid','tgx','tgy','itemtype',
                'itemid','itemlink','price','brand','region','currency','description'];
    
    // comment-reply 表联查的 返回字段
    static public $cmtRp_CmtClum=['cmtid','comment','cmt_userid','cmttime'];
    static public $cmtRp_RpClum=['rpid','rpcontent','rp_userid','be_rp_userid','rptime'];
    
    
    // day - icon 返回结构
    static public $day_iconClm=['cdate','iconfid'];
    
    // 主键 自增的表
    static public $selfAddPrimaryTable=['lee_image_tag',
        'lee_icon_comment','lee_comment_reply','lee_icon_store',
        'lee_icon_favor'
    ];
    
    
    /**
     * 返回数据表的所有列
     * @param string $tableName 数据表名称
     * @return array 数据表的所有列
     */
    static public function getColumns($tableName){
        return Schema::getColumnListing($tableName);
    }
    
    /**
     * 为该插入数据的缺省列 添加默认值 null
     * @param string $tbName ,table name
     * @param array $datas,插入的数据
     * @return array　补充后的数据
     */
    static public function addMissColumnValue($tbName,array $datas) {
        $columns=self::getColumns($tbName);
        // 表的id 为自增字段  无需赋值填充
        if( in_array($tbName, self::$selfAddPrimaryTable) ){
            array_splice($columns,array_search('id', $columns) ,1);
        }
        // 补全所有字段 缺省为null
        $dataCount=count($datas);
        for ($i=0;$i<$dataCount;$i++){
            $exsitColum=array_keys($datas[$i]);

            // 差集
            $addColum=array_diff($columns, $exsitColum);
            // 添加数据项
            foreach ($addColum as $addOne){
                // fid 为自增字段 跳过
                if ($addOne == 'fid'){
                    continue;
                }
                if($addOne == 'created_at' || $addOne== 'updated_at')
                    // 创建时间戳
                    $datas[$i][$addOne]=date('Y-m-d H:i:s');
                else $datas[$i][$addOne]=null;
            }
        }
        return $datas;
    }
    
    
    /**
     * 解析 icon-image关联检索后的的数据 将其转换为树结构
     * @param array $iconData输入数据
     * 如[
     *   [iconinfo1,imageinfo1],
     *   [iconinfo1,imageinfo2],
     *   [iconinfo2,imageinfo1],
     *  ]
     * 
     * 解析结果为：
     * [
     *  [iconinfo1,images=>[imageinfo1,imageinfo2]],
     *  [iconinfo2,images=>[imageinfo1]],
     * ]
     */
    static public function parseIconImgDatas(array $iconDatas){
        $rst=[];
        //icon的总记录数
        $iconClum=self::$iconImg_IconClum;
        $imgClum=self::$iconImg_ImgClum;
        $iconNum=0;
        foreach ($iconDatas as $iconItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($iconItem->icnfid, 
                array_column($rst, 'icnfid'))){
                $rstIconItem=[];
                // 添加icon返回列
                foreach ($iconClum as $value){
                    $rstIconItem[$value]=$iconItem->$value;
                }
                // 添加新的icon数据记录
                $rst[$iconNum]= $rstIconItem;
                // 添加 images键
                $rst[$iconNum]['images']=[];
                $iconNum++;
            }
            // imag的fid为空
            // if($iconItem->imgfid == null){
               // continue;
            // }
            // 添加imag 记录
            $rstImgItem=[];
            foreach ($imgClum as $value){
                $rstImgItem[$value]=$iconItem->$value;
            }
            array_push($rst[$iconNum-1]['images'], $rstImgItem);
        }
        
        return $rst;
    }
    
    // 无 用户属性信息
    static public function parseIconImgDatas2(array $iconDatas){
        $rst=[];
        //icon的总记录数
        $iconClum=self::$iconImg_IconClum2;
        $imgClum=self::$iconImg_ImgClum;
        $iconNum=0;
        foreach ($iconDatas as $iconItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($iconItem->icnfid,
                array_column($rst, 'icnfid'))){
                $rstIconItem=[];
                // 添加icon返回列
                foreach ($iconClum as $value){
                    $rstIconItem[$value]=$iconItem->$value;
                }
                // 添加新的icon数据记录
                $rst[$iconNum]= $rstIconItem;
                // 添加 images键
                $rst[$iconNum]['images']=[];
                $iconNum++;
            }
            // imag的fid为空
            // if($iconItem->imgfid == null){
            // continue;
            // }
            // 添加imag 记录
            $rstImgItem=[];
            foreach ($imgClum as $value){
                $rstImgItem[$value]=$iconItem->$value;
            }
            array_push($rst[$iconNum-1]['images'], $rstImgItem);
        }
    
        return $rst;
    }
    
    
    // 无 用户属性信息
    static public function parseIconImgDatas3(array $iconDatas){
        $rst=[];
        //icon的总记录数
        $iconClum=self::$iconImg_IconClum3;
        $imgClum=self::$iconImg_ImgClum;
        $iconNum=0;
        foreach ($iconDatas as $iconItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($iconItem->icnfid,
                array_column($rst, 'icnfid'))){
                $rstIconItem=[];
                // 添加icon返回列
                foreach ($iconClum as $value){
                    $rstIconItem[$value]=$iconItem->$value;
                }
                // 添加新的icon数据记录
                $rst[$iconNum]= $rstIconItem;
                // 添加 images键
                $rst[$iconNum]['images']=[];
                $iconNum++;
            }
            // imag的fid为空
            // if($iconItem->imgfid == null){
            // continue;
            // }
            // 添加imag 记录
            $rstImgItem=[];
            foreach ($imgClum as $value){
                $rstImgItem[$value]=$iconItem->$value;
            }
            array_push($rst[$iconNum-1]['images'], $rstImgItem);
        }
    
        return $rst;
    }
    
    
    
    // 无 用户属性信息
    static public function parseIconImgDatas4(array $iconDatas){
        $rst=[];
        //icon的总记录数
        $iconClum=self::$iconImg_IconClum4;
        $imgClum=self::$iconImg_ImgClum;
        $iconNum=0;
        foreach ($iconDatas as $iconItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($iconItem->icnfid,
                array_column($rst, 'icnfid'))){
                $rstIconItem=[];
                // 添加icon返回列
                foreach ($iconClum as $value){
                    $rstIconItem[$value]=$iconItem->$value;
                }
                // 添加新的icon数据记录
                $rst[$iconNum]= $rstIconItem;
                // 添加 images键
                $rst[$iconNum]['images']=[];
                $iconNum++;
            }
            // imag的fid为空
            // if($iconItem->imgfid == null){
            // continue;
            // }
            // 添加imag 记录
            $rstImgItem=[];
            foreach ($imgClum as $value){
                $rstImgItem[$value]=$iconItem->$value;
            }
            array_push($rst[$iconNum-1]['images'], $rstImgItem);
        }
    
        return $rst;
    }
    
    
    /**
     * 解析 image-tag表联合检索的数据
     * @param array $imgTagDatas 联合检索返回的数据
     * 形式[
     *      ['imgfid'=>imgfid1,'tagid'=>tagid1,...],
     *      ['imgfid'=>imgfid1,'tagid'=>tagid2,...],
     *      ['imgfid'=>imgfid2,'tagid'=>tagid33,...],
     *    ] 
     * @return 二维数组
     * 如 [
     *      ['imgfid'=>imgfid1,'tags'=>[['tgid'=>tagid1,...],['tgid'=>tagid2,...]] ],
     *      ['imgfid'=>imgfid1,'tags'=>[['tgid'=>tagid33,...]] ],
     *   ']
     * 
     */
    static public function parseImgTagDatas(array $imgTagDatas){
        $rst=[];
        $imgClum=self::$imgTag_ImgClum;
        $tagClum=self::$imgTag_TagClum;
        $imgNum=0;
        foreach ($imgTagDatas as $imgItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($imgItem->imgfid,
                array_column($rst, 'imgfid'))){
                $rstImgItem=[];
                // 添加icon返回列
                foreach ($imgClum as $value){
                    $rstImgItem[$value]=$imgItem->$value;
                }
                // 添加新的image数据记录
                $rst[$imgNum]= $rstImgItem;
                // 添加 images键
                $rst[$imgNum]['tags']=[];
                $imgNum++;
            }
            
            // tag的id为空
            if($imgItem->tgid == null){
                continue;
            }
            // 添加Tag 记录
            $rstTagItem=[];
            foreach ($tagClum as $value){
                $rstTagItem[$value]=$imgItem->$value;
            }
            array_push($rst[$imgNum-1]['tags'], $rstTagItem);
        }
        
        return $rst;
    }
    
    /**
     * 依据 数组的主键值给 数组 降维 
     * @param array $orgDatas 待降维的二维数组
     * 如:[  ['fid'=>fid1,'info'=>info1,'value'=>v1],
     *      ['fid'=>fid2,'info'=>info2,'value'=>v2],
     *      ['fid'=>fid3,'info'=>info3,'value'=>v3]
     * ]
     * @param string $primaryKey 降维的 主键标识 如上数据的 'fid'键
     * @return array() 一维数组
     * 如 [  'fid1'=>['info'=>info1,'value'=>v1],
     *      'fid2'=>['info'=>info2,'value'=>v2],
     *      'fid3'=>['info'=>info3,'value'=>v3]
     *  ]
     */
    static  public function cutArrayDimens(array $orgDatas,$primaryKey){
        $rst=[];
        foreach($orgDatas as $item){
            $itemPrimValue=$item->$primaryKey;
            
            $newItem=[];
            foreach ($item as $key => $value){
                // 跳过 主键的值
                if ($key !== $primaryKey){
                    $newItem[$key]=$value;
                }
            }
            $rst[$itemPrimValue]=$newItem;
        }
        return $rst;
    }
    
    /**
     * 依据 主键值 将一个数组合并到另一个数组中
     * @param array $datas,二维数组 原始数据
     * [    ['fid'=>fid1,'name'=>name1],
     *      ['fid'=>fid2,'name'=>name2],
     *      ['fid'=>fid3,'name'=>name3]
     * ]
     * @param array $mainDatas,将合 合并的数据 
     * 二维数组 如:
     * [
     *      ['fid'=>fid1,'info'=>info1,'title'=>t1],
     *      ['fid'=>fid2,'info'=>info2,'title'=>t2],
     *      ['fid'=>fid3,'info'=>info3,'title'=>t3] 
     * ]
     * @param string $primaryKey,将要合并数组的主键
     * @return array, 二维数组
     * 如 [
     *    ['fid'=>fid1,'name'=>name1,'info'=>info1,'title'=>t1],  
     *    ['fid'=>fid2,'name'=>name2,'info'=>info2,'title'=>t2],
     *    ['fid'=>fid3,'name'=>name3,'info'=>info3,'title'=>t3]
     * ]  
     */
    static public function mergeArrayByPK(array $mainDatas,array $mergedData,$primaryKey){
        // 降维数组
        $pcData=self::cutArrayDimens($mergedData, $primaryKey);
        $mainDatasFids=array_column($mainDatas, $primaryKey);
        // 拼接 两个数组     
        foreach ($pcData as $key=>$item){
            $index=array_search($key, $mainDatasFids);
            foreach ($item as $subKey=>$subValue){
                $mainDatas[$index][$subKey]=$subValue;
            }
        }
        return $mainDatas;
    }
    
    /**
     * 依据评论回复 数据集  返回 所有用户的ID
     * @param array $cmtRpDatas 评论-回复数据 （或者回复数据），二维数组
     * @return 一维数组 用户id的集合
     */
    static public function useridsFromComments(array $cmtRpDatas){
        $userids=[];
        foreach ($cmtRpDatas as $cmtRpItem){
            foreach ($cmtRpItem as $key => $value){
                if($key=='cmt_userid'||
                    $key=='rp_userid'||$key=='be_rp_userid'){
                    array_push($userids, $value);
                }
            }
        }
        // 去除重复值
        return array_filter(array_unique($userids));
    }
    
    /**
     * 将user二维数组 转换为一维键值数组
     * @param array $userDatas,用户数据  二维数组
     * 至少包含 userid ,username 记录
     * 如[
     *      ['userid'=>user1,'username'=>usern1],
     *      ['userid'=>user2,'username'=>usern2],
     *   ]
     *@return 一维数组 [user1=>usern1,user2=>usern2]
     */
    static public function userId2Name(array $userDatas){
        $idNames=[];
        foreach($userDatas as $item){
            $idNames[$item->userid]=$item->username;
        }
        return $idNames;
    }
    
    /**
     * 
     * @param array $cmtRpDatas, 评论-回复表检索结果,二维数组
     * 如: [ 
     *      ['cmtid'=>cmtid1,'otherinfo'=>info1],
     *      ['cmtid'=>cmtid2,'otherinfo'=>info2]
     *     ]
     * @param array $userIDName,用户 id-name键值数组,一维数组
     * 如：[userid1=>username1,userid2=>username2]
     */
    static  public function parseCmtRpDatas(array $cmtRpDatas,array $userIDName){
        $rst=[];
        $cmtClum=self::$cmtRp_CmtClum;
        $rpClum=self::$cmtRp_RpClum;
        $cmtNum=0;
        foreach ($cmtRpDatas as $cmtItem){
            // 数据记录不再 已保存数据记录中
            if(!in_array($cmtItem->cmtid,
                array_column($rst, 'cmtid'))){
                $rstCmtItem=[];
                // 添加comment表的返回列
                foreach ($cmtClum as $value){

                    $rstCmtItem[$value]=$cmtItem->$value;
                    // 评论者的id为键,再次添加用户名称
                    if($value == 'cmt_userid'){
                        // 添加用户名项目
                        $rstCmtItem['cmt_username']=$userIDName[$cmtItem->$value];
                    }
                }
                // 添加新的comment数据记录
                $rst[$cmtNum]= $rstCmtItem;
                // 添加 replys键
                $rst[$cmtNum]['rps']=[];
                $cmtNum++;
            }
            // 添加reply 记录
            $rstRpItem=[];
            // reply 记录为空  
            if($cmtItem->rpid==null){
                continue;
            }
            foreach ($rpClum as $value){
                
                $rstRpItem[$value]=$cmtItem->$value;
                // 键为回复者的id 或 被回复着id, 添加用户名
                if($value == 'rp_userid' &&  $cmtItem->$value !=null){
                    $rstRpItem['rp_username']=$userIDName[$cmtItem->$value];
                }
                if($value == 'be_rp_userid'  &&  $cmtItem->$value !=null ){
                    $rstRpItem['be_rp_username']=$userIDName[$cmtItem->$value];
                }
            }
            array_push($rst[$cmtNum-1]['rps'], $rstRpItem);
        }
        return $rst;
    }
    
        
    static public function parseIconImgDatasSelf(array $iconDatas){
            $rst=[];
            //icon的总记录数
            $iconClum=self::$iconImg_IconClumSelf;
            $imgClum=self::$iconImg_ImgClum;
            $iconNum=0;
            foreach ($iconDatas as $iconItem){
                // 数据记录不再 已保存数据记录中
                if(!in_array($iconItem->icnfid, 
                    array_column($rst, 'icnfid'))){
                    $rstIconItem=[];
                    // 添加icon返回列
                    foreach ($iconClum as $value){
                        $rstIconItem[$value]=$iconItem->$value;
                    }
                    // 添加新的icon数据记录
                    $rst[$iconNum]= $rstIconItem;
                    // 添加 images键
                    $rst[$iconNum]['images']=[];
                    $iconNum++;
                }
                // imag的fid为空
                // if($iconItem->imgfid == null){
                   // continue;
                // }
                // 添加imag 记录
                $rstImgItem=[];
                foreach ($imgClum as $value){
                    $rstImgItem[$value]=$iconItem->$value;
                }
                array_push($rst[$iconNum-1]['images'], $rstImgItem);
            }
            
            return $rst;
        }
    
    /**
     * 将user数据 插入到 回复数据中
     * @param array $rpDatas,回复数据
     * 如[
     *      ['rpid'=>rp1,'rpcontent'=>rpc,'rp_userid'=>rpu1,'be_rp_userid'=>berpu1],
     *      ['rpid'=>rp2,'rpcontent'=>rpc2,'rp_userid'=>rpu2,'be_rp_userid'=>berpu2],
     *  ]
     * @param array $userInfo,用户信息
     * [
     *      'userid1'=>['username'=>usern1,'avatar'=>a1],
     *      'userid2'=>['username'=>usern2,'avatar'=>a2],
     * ]
     */
    static public function userInfo2Rps(array $rpDatas,array $userInfo){
        $rpNum=0;
        foreach ($rpDatas as $item){
            // 循环便rp 每条记录 的 每个项目
            foreach ($item as $key =>$value){
                if($key == 'rp_userid' && array_key_exists($value,$userInfo) ){
                   $item->rp_userinfo=$userInfo[$value];
                }
                if($key == 'be_rp_userid'  && array_key_exists($value,$userInfo)){
                    $item->be_rp_userinfo=$userInfo[$value];
                }
            }
            $rpNum++;
        }
        return $rpDatas;
    }
    
   
   
   /**
    * 将icon的输入数据进行解析，添加 icon-image，image-tag的关联关系
    * 添加 image的存储路径 path
    * 并返回 icon image tag 拆分数组
    * @param array $inputIcnDatas，icon的输入数据
    * @param array $icnArr,icon 将要存储的数据
    * @param array $imgArr,image 将要存储的数据
    * @param array $tagsArr, tag 将要存储的数据
    */
    static public function parasIcnInputData(array $inputIcnDatas,array &$icnArr,
            array &$imgArr,array &$tagsArr    ){
        // icon 的uuid
        $IconUuid=uuidMath::createUuid();
        // 返回Icon对象
        $inputIcnDatas['icon']['id']=$IconUuid;
        $icnArr=$inputIcnDatas['icon'];
        $imageCount=count($inputIcnDatas['image']);
        // 添加 image id的集合
        for($i=0;$i<$imageCount;$i++){
            $imgUuid=uuidMath::createUuid();
            // 为数据记录 添加主键
            $inputIcnDatas['image'][$i]['id']=$imgUuid;
            // 添加 image的存储 路径
            $inputIcnDatas['image'][$i]['path']=File::getImgName();;
            // 添加 icon标签
            $inputIcnDatas['image'][$i]['iconid']=$IconUuid;
            // image 的tag 数
            $imgTagCount= count( $inputIcnDatas['image'][$i]['tag']);
            
            for($k=0;$k<$imgTagCount;$k++){
                // 为tag数据记录 添加image标识
                $inputIcnDatas['image'][$i]['tag'][$k]['imageid']=$imgUuid;
                // 返回 tags 项
                array_push($tagsArr, $inputIcnDatas['image'][$i]['tag'][$k]);
            }
            // 删除该 image的tag项
            unset($inputIcnDatas['image'][$i]['tag']);
            // 添加 image项
            array_push($imgArr, $inputIcnDatas['image'][$i]);
        }
    }
    
    /**
     * 解析  月=>icon 数据
     * @param array $dayIconsArr 形式：[ [dy1,icon1],[d1,icon2],[d2,icon3] ]
     * 返回 ['d1'=>[icon1,icon2],'d2'=>[icon3]]
     */
    static public function parseDayIcon( $dayIconsObj){
        $rstK=self::$day_iconClm;
        $rst=[];
        foreach ($dayIconsObj as $Itm){
            $day=$Itm->cdate;
            $iconfid=$Itm->iconfid;
            if(array_key_exists($day, $rst)){
                array_push($rst[$day],$iconfid);
            }else{
                $rst[$day]=[$iconfid];
            }
        }
        count($rst)==0?$rst=null:$rst;
        return $rst;
    }
    
    /**
     * 合并 icon icon-topic 检索结果
     * @param array $icnDatas
     * @param array $icnTpc
     * @param unknown $icnfid
     * 
     * $icnDatas [  ['icnfid'=>1,...],['icnfid'=>2,...] ]
     * $icnTpc  [ [icnfid1]=>[],[icnfid2]=>[] ]
     * $icnfid --> icon records fid
     * 
     */
    static public function mergeIcnTpcData(array $icnDatas,array $icnTpc,$icnfid){
        foreach ($icnDatas as $key=> $item){
            $icnDatas[$key]['topics']=$icnTpc[ $item[$icnfid] ] ;
        }
        return $icnDatas;
    }
    
    
}
?>